package controller.commoncontroller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import view.commonview.ConnectorPath;
import view.editorview.EditorArea;
import model.editormodel.EditorModel;
import model.editormodel.Input;
import model.editormodel.Output;

/**
 * <b>Implementiert:</b> <code>ActionListener</code> <br>
 * <b>In Verbindung stehende Klassen:</b> <code>EditorModel, EditorArea</code><br>
 * <br>
 * Zugehoerige Controllerklasse zu dem Menueeintrag <i>Bearbeiten -->
 * Loeschen</i>. Diese Klasse stoesst das <code>EditorModel</code> an, alle
 * markierten Elemente zu loeschen.
 * 
 * @author Team Locsi
 * 
 */

public class DeleteSelectionListener implements ActionListener {

	private EditorArea eArea;
	private EditorModel eModel;

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>DeleteSelectionListener</code>
	 * - Objekt.
	 * 
	 * @param eArea
	 *            <code>EditorArea</code> - Referenz auf die
	 *            <code>EditorArea</code>
	 * @param eModel
	 *            <code>EditorModel</code> - Referenz auf das
	 *            <code>EditorModel</code>
	 */
	public DeleteSelectionListener(EditorArea eArea, EditorModel eModel) {
		this.eArea = eArea;
		this.eModel = eModel;
	}

	/**
	 * Hier wird das <code>EditorModel</code> angestossen die markierten
	 * Elemente zu loeschen. Dabei werden die zu loeschenden Elemente aus der
	 * <code>EditorArea</code> uebergeben.
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		List<String> markedElementsNames = eArea
				.getNamesOfSelectedElements();
		List<ConnectorPath> markedPaths = eArea
				.getMarkedConnectorPaths();
		
		//falls keine linien und elements markiert sind kann
		//sofort abgebrochen werden
		if (markedPaths.isEmpty() && markedElementsNames.isEmpty()) {
			return;
		}
		
		Map<Input, Output> deleteConnections = new HashMap<Input, Output>();

		// loeschen der markierten linien
		for (int i = 0; i < markedPaths.size(); i++) {
			deleteConnections.put(markedPaths.get(i).getTarget(),
					markedPaths.get(i).getSource());
		}

		// loeschen aller markierten Linien im EditorModel
		eModel.deleteConnections(deleteConnections);

		// loeschen aller markierten Elemente im EditorModel
		eModel.deleteLogicElements(markedElementsNames);
	}
}